PATH
Mac OS X Documentation >
Developer Tools >
The Objective-C Compiler
Interoperation
This section lists various difficulties encountered in using GNU C or GNU C++ together with other compilers or with the assemblers, linkers, libraries and debuggers on certain systems.
GNU C++ does not do name mangling in the same way as other C++ compilers. This means that object files compiled with one compiler cannot be used with another.
This effect is intentional, to protect you from more subtle problems. Compilers differ as to many internal details of C++ implementation, including: how class instances are laid out, how multiple inheritance is implemented, and how virtual function calls are handled. If the name encoding were made the same, your programs would link against libraries provided from other compilers--but the programs would then crash when run. Incompatible libraries are then detected at link time, rather than at run time.
-
Older GDB versions sometimes fail to read the output of GNU CC version 2. If you have trouble, get GDB version 4.4 or later.
-
Use of
-I/usr/include
may cause trouble.
-
On a Sparc, GNU CC aligns all values of type
double
on an 8-byte boundary, and it expects every
double
to be so aligned. The Sun compiler usually gives
double
values 8-byte alignment, with one exception: function arguments of type
double
may not be aligned.
As a result, if a function compiled with Sun CC takes the address of an argument of type
double
and passes this pointer of type
double *
to a function compiled with GNU CC, dereferencing the pointer may cause a fatal signal.
One way to solve this problem is to compile your entire program with GNU CC. Another solution is to modify the function that is compiled with Sun CC to copy the argument into a local variable; local variables are always properly aligned. A third solution is to modify the function that uses the pointer to dereference it via the following function
access_double
instead of directly with
*
:
inline double access_double (double *unaligned_ptr) {
union d2i {
double d;
int i[2];
};
union d2i *p = (union d2i *) unaligned_ptr;
union d2i u;
u.i[0] = p->i[0];
u.i[1] = p->i[1];
return u.d;
}
Storing into the pointer can be done likewise with the same union.
-
On Solaris, the
malloc
function in the
libmalloc.a
library may allocate memory that is only 4 byte aligned. Since GNU CC on the Sparc assumes that doubles are 8 byte aligned, this may result in a fatal signal if doubles are stored in memory allocated by the
libmalloc.a
library.
The solution is to not use the
libmalloc.a
library. Use instead
malloc
and related functions from
libc.a
; they do not have this problem.
-
The 128-bit long double format that the Sparc port supports currently works by using the architecturally defined quad-word floating point instructions. Since there is no hardware that supports these instructions they must be emulated by the operating system. Long doubles do not work in Sun OS versions 4.0.3 and earlier, because the kernel emulator uses an obsolete and incompatible format. Long doubles do not work in Sun OS version 4.1.1 due to a problem in a Sun library. Long doubles do work on Sun OS versions 4.1.2 and higher, but GNU CC does not enable them by default. Long doubles appear to work in Sun OS 5.x (Solaris 2.x).
-
On HP-UX version 9.01 on the HP PA, the HP compiler
cc
does not compile GNU CC correctly. We do not yet know why. However, GNU CC compiled on earlier HP-UX versions works properly on HP-UX 9.01 and can compile itself properly on 9.01.
-
On the HP PA machine, ADB sometimes fails to work on functions compiled with GNU CC. Specifically, it fails to work on functions that use
alloca
or variable-size arrays. This is because GNU CC doesn't generate HP-UX unwind descriptors for such functions. It may even be impossible to generate them.
-
Taking the address of a label may generate errors from the HP-UX PA assembler. GAS for the PA does not have this problem.
-
Using floating point parameters for indirect calls to static functions will not work when using the HP assembler. There simply is no way for GCC to specify what registers hold arguments for static functions when using the HP assembler. GAS for the PA does not have this problem.
-
In extremely rare cases involving some very large functions you may receive errors from the HP linker complaining about an out of bounds unconditional branch offset. This used to occur more often in previous versions of GNU CC, but is now exceptionally rare. If you should run into it, you can work around by making your function smaller.
-
GNU CC compiled code sometimes emits warnings from the HP-UX assembler of the form:
(warning) Use of GR3 when frame >= 8192 may cause conflict.
These warnings are harmless and can be safely ignored.
The Objective-C CompilerPrevious | Contents | Next